package com.rainbow.support.half.message.handler;

import com.alibaba.fastjson.JSON;
import com.rainbow.common.core.error.GlobalException;
import com.rainbow.support.half.message.entity.HalfMessagePayload;
import org.springframework.lang.NonNull;
import org.springframework.util.Assert;
import java.util.Optional;

/**
 * rocketMq半事务统一处理类
 * 判断事务状态,检查生产者业务数据,
 * 方便幂等处理
 * @author 傅为地
 */
public interface BaseHalfMsgHandler {

    /**
     * 解析半事务消息
     * @param msg 源消息
     * @return  解析半事务消息
     */
    default HalfMessagePayload parseHalfMessagePayload(@NonNull String msg){
        HalfMessagePayload source = Optional.ofNullable(JSON.parseObject(msg, HalfMessagePayload.class)).orElseThrow(() -> new GlobalException("RocketMq半事务消息不能为空,请检查数据!"));
        Assert.notNull(source.getGlobalId(), "RocketMq半事务消息,全局事务编号不能为空,请检查数据!");
        Assert.notNull(source.getBranchId(), "RocketMq半事务消息,分支事务编号不能为空,请检查数据!");
        Assert.notNull(source.getOriginBody(), "RocketMq半事务消息,事务消息体不能为空,请检查数据!");
        Assert.notNull(source.getCreator(), "RocketMq半事务消息,发送人不能为空,请检查数据!");
        Assert.notNull(source.getCreateTime(), "RocketMq半事务消息,发送时间不能为空,请检查数据!");
        return source;
    }
}
